/**
 * CLASSE TelaClientes
 *
 * Esta classe contem toda a implementacao do menu de clientes do sistema. 
 * No arquivo "SistemaAdvocacia.java", um objeto desta classe eh criado no
 * metodo "menuPrincipal" para representar o menu de clientes dentro do 
 * codigo.
 */

//-------------------------------------------------------------------
// I M P O R T A C A O   D E   C L A S S E S   D A   A P I   J A V A
//-------------------------------------------------------------------

import java.util.Scanner;

/**
 * Inicio da especificacao da classe.
 */
public class TelaClientes {

//------------------------------------------------------
// A T R I B U T O S
//------------------------------------------------------

	/**
	 * Armazena uma referencia para o objeto da classe ListagemClientes utilizado
	 * por este menu. Este objeto serah acessado para consulta e/ou alteracao dos
	 * dados dos clientes cadastrados no sistema.
	 */
	ListagemClientes listaClientes;

//------------------------------------------------------
// C O N S T R U T O R E S
//------------------------------------------------------
	
	/**
	 * Unico construtor da classe.
	 */
	public TelaClientes() {
		this.listaClientes = new ListagemClientes();
	}

//------------------------------------------------------
// M E T O D O S
//------------------------------------------------------
	
	/**
	 * METODO menu
	 * 		Mostra o menu de clientes do sistema e controla a execucao de cada opcao. 
	 */
	public void menu() {
	
		Scanner entrada = new Scanner(System.in);
		
		// Esta variavel serah usada para controlar o loop abaixo, implementado usando uma estrutura "while". Quando
		// o usuario escolher a opcao "Voltar ao menu principal", a variavel recebera o valor "true", que causara o
		// termino da repeticao.
		boolean sair = false;
		
		while(!sair) { // Enquanto o usuario nao escolher sair do menu de clientes...
		
			// Mostra as opcoes do menu de clientes para o usuario.
			System.out.println("\n--------------- MENU CLIENTES ---------------\n");
			System.out.println("  Lista de opcoes disponiveis:               ");
			System.out.println("      1 - Incluir Cliente                    ");
			System.out.println("      2 - Alterar dados do cliente           ");
			System.out.println("      3 - Consultar dados do cliente         ");
			System.out.println("      4 - Consultar clientes por nome        ");
			System.out.println("      5 - Voltar ao menu principal           \n");
			
			// Solicita ao usuario que digite o numero da opcao escolhida.
			System.out.print  ("   >>> Digite sua opcao: ");
			int opcao = entrada.nextInt();
			
			// Este "while" repete a leitura da opcao escolhida pelo usuario ate que este informe uma opcao valida,
			// ou seja, um numero de 1 a 5.
			while(opcao < 1 || opcao > 5) {
				System.out.println("ERRO: Opcao invalida!");
				System.out.print  ("   >>> Digite sua opcao novamente: ");
				opcao = entrada.nextInt();
			}
			
			// Este "switch" esta sendo usado para a exibicao da tela selecionada pelo usuario no menu clientes,
			// a partir do numero da opcao escolhida por ele.
			switch(opcao) {
			
				case 1 : // Opcao "Incluir Cliente". 
					incluiCliente();
					break;
					
				case 2 : // Opcao "Alterar dados do cliente". 
					alteraCliente();
					break;
					
				case 3 : // Opcao "Consultar dados do cliente". 
					consultaCliente();
					break;
					
				case 4 : // Opcao "Consultar clientes por nome". 
					consultaClientesPorNome();
					break; 
					
				case 5 : // Opcao de "Voltar ao menu principal". 
					sair = true;
					
			} // fim do switch iniciado na linha 85
			
		} // fim do while iniciado na linha 60
		
	} // fim do metodo "menu"
	
	/**
	 * METODO incluiCliente
	 * 		Mostra e gerencia a tela de inclusao de cliente. Esta tela solicita ao usuario que digite todos
	 * dados de um novo cliente e efetua o registro na lista de clientes.
	 */
	public void incluiCliente() {
	
		Cliente c = new Cliente();
		Scanner entrada = new Scanner(System.in);
		
		// Mostra o titulo desta tela.
		System.out.println("\n------------ INCLUSAO DE CLIENTE ------------");
		System.out.println();
		
		// Faz a leitura dos dados do cliente
		System.out.print("Codigo...: ");
		c.codigo = Integer.parseInt(entrada.nextLine());
		System.out.print("Nome.....: ");
		c.nome = entrada.nextLine().toUpperCase();
		System.out.print("Endereco.: ");
		c.endereco = entrada.nextLine().toUpperCase();
		System.out.print("Telefone.: ");
		c.telefone = entrada.nextLine();
		System.out.print("E-mail...: ");
		c.email = entrada.nextLine();
		
		// Inclui o novo cliente na lista de clientes
		listaClientes.incluirCliente(c);
	} // Fim do metodo "incluiCliente"
	
	/**
	 * METODO mostraCliente
	 * 		Le o codigo de um cliente do usuario e mostra os dados desse cliente na tela.
	 * Os dados do cliente sao devolvidos dentro de um objeto da classe Cliente.
	 */
	public Cliente mostraCliente() {
	
		Scanner entrada = new Scanner(System.in);
		Cliente c;
		
		// A repeticao efetuada por este do...while serve para repetir a leitura do codigo
		// do cliente a ser consultado ateh que o usuario digite um numero que exista no cadastro.
		do {
		
			// Le o codigo do cliente digitado pelo usuario.
			System.out.print("Codigo do cliente...: ");
			int codCliente = Integer.parseInt(entrada.nextLine());
			
			// Procura pelo cliente no cadastro
			c = listaClientes.consultaPorCodigo(codCliente);
			if(c == null)
				System.out.println("Codigo nao cadastrado! Digite novamente.");
				
		} while(c == null);
		
		// Mostra os dados do cliente na tela.
		System.out.println("Nome.....: " + c.nome);
		System.out.println("Endereco.: " + c.endereco);
		System.out.println("Telefone.: " + c.telefone);
		System.out.println("E-mail...: " + c.email);

		// Retorna a referencia para o objeto que contem os dados do cliente consultado.
		return c;
	} // Fim do metodo mostraCliente
	
	/**
	 * METODO alteraCliente
	 * 		Mostra e gerencia a tela de alteracao de endereco, telefone e e-mail de um cliente. Nesta tela o
	 * programa solicita ao usuario o codigo de um cliente e permite que este altere o endereco, telefone e
	 * e-mail deste cliente.
	 */
	public void alteraCliente() {
	
		Scanner entrada = new Scanner(System.in);
		
		// Mostra o titulo desta tela.
		System.out.println("\n---------- ALTERA DADOS DO CLIENTE ---------");
		System.out.println();
		
		// Chama o metodo "mostraCliente" para consultar o cliente que deve ter seus dados
		// alterados.
		Cliente c = mostraCliente();
		
		// Le os novos valores para o endereco, telefone e e-mail do cliente e altera esses dados no objeto
		// referenciado pela variavel "c".
		System.out.println("\nInforme abaixo o novo endereco, telefone e e-mail.");
		System.out.print("Endereco...........: ");
		c.endereco = entrada.nextLine().toUpperCase();
		System.out.print("Telefone...........: ");
		c.telefone = entrada.nextLine();
		System.out.print("E-mail.............: ");
		c.email = entrada.nextLine();
		
		// Realiza a alteracao na lista de alunos.
		listaClientes.alterarCliente(c);
		
	} // Fim do metodo "alteraCliente".
	
	/**
	 * METODO consultaCliente
	 * 		Mostra e gerencia a tela de consulta de dados de um cliente. Basicamente, este metodo
	 * eh uma casca para o que o metodo "mostraCliente" faz e mostra.
	 */
	public void consultaCliente() {
	
		Scanner entrada = new Scanner(System.in);
		
		// Mostra o titulo desta tela.
		System.out.println("\n--------- CONSULTA DADOS DO CLIENTE ---------");
		System.out.println();
		
		// Chama o metodo mostraCliente para solicitar ao usuario o codigo do cliente
		// e mostrar os seus dados.
		mostraCliente();
		
		// Aguarda ateh que o usuario pressione a tecla ENTER. Isso foi colocado aqui para que
		// o usuario possa ler as informacoes mostradas.
		System.out.print("\nPressione ENTER para continuar...");
		entrada.nextLine();
	} // Fim do metodo consultaCliente.
	
	/**
	 * METODO consultaClientesPorNome
	 * 		Mostra e gerencia a tela de consulta de clientes por nome. Esta tela permite que o usuario
	 * visualize uma lista de clientes que contenham em seus nomes um string digitado. Serao exibidos nessa
	 * lista os codigos e nomes desses clientes. Esta opcao serve para aqueles casos onde o usuario deseja
	 * saber qual o codigo de um determinado cliente, conhecendo o nome deste cliente ou parte dele.
	 */
	public void consultaClientesPorNome() {
	
		Scanner entrada = new Scanner(System.in);
		
		// Mostra o titulo desta tela.
		System.out.println("\n-------- CONSULTA CLIENTES POR NOME ---------");
		System.out.println();
		
		// Le o nome ou parte dele, para realizar a pesquisa. O que for digitado pelo usuario serah
		// convertido para maiusculas, para possibilitar a pesquisa correta (lembre-se que o nome do
		// cliente estah sendo armazenado com letras maiusculas).
		System.out.print("Nome ou parte dele.: ");
		String nome = entrada.nextLine().toUpperCase();

		// Consulta os clientes que possuem a parte do nome digitada. 
		Cliente[] clientes = listaClientes.consultaPorNome(nome);
		
		// Verifica se algum cliente foi encontrado. Se nenhum cliente for encontrado, o vetor retornado
		// acima terah zero elementos.
		if(clientes.length > 0) {
		
			// Mostra o cabecalho da tabela que contera os dados dos clientes encontrados.
			System.out.println("COD. - NOME");	
			System.out.println("----   --------------------------------");	
		
			// Mostra os dados dos clientes, sendo uma linha para cada cliente.
			for(int i = 0; i < clientes.length; i++) {
				System.out.printf("%04d - %s\n",
									clientes[i].codigo,
									clientes[i].nome);
			}
			
		} else {
			System.out.println("Desculpe, mas nenhum cliente foi encontrado.");
		} 
		
		// Aguarda ateh que o usuario pressione a tecla ENTER. Isso foi colocado aqui para que
		// o usuario possa ler as informacoes mostradas.
		System.out.print("\nPressione ENTER para continuar...");
		entrada.nextLine();
		
	} // fim do metodo "consultaClientesPorNome"
	
} // fim da classe TelaClientes